// 声明合并
// 如果定义了两个相同名字的函数、接口或类，那么他们会合并成一个类型：

// 函数的合并
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else {
        return x.split('').reverse().join('');
    }
}

// 接口的合并
interface Alarm {
    price: number;
}
interface Alarm {
    weight: number;
}
interface Alarm {
    price: number;
    weight: number;
}

// 相同属性合并，属性的类型必须是唯一的：
interface Alarm1 {
    price: number;
}
interface Alarm1 {
    price: number; // 虽然重复了，但是类型都是 `number`，所以不会报错
    weight: number;
}

interface Alarm2 {
    price: number;
}
interface Alarma extends Alarm2 {
    // price: string;  // 类型不一致，会报错
    weight: number;
}
let aaaa: Alarma = {
    price: 123,
    weight: 1,
};

// 接口中方法的合并，与函数的合并一样
interface Alarm3 {
    price: number;
    alert(s: string): string;
}
interface Alarm3 {
    weight: number;
    alert(s: string, n: number): string;
}
// 相当于
interface Alarm3 {
    price: number;
    weight: number;
    alert(s: string): string;
    alert(s: string, n: number): string;
}
